#pragma once

#include "noncopyable.h"
#include "Timestamp.h"

#include <vector>
#include <unordered_map>

class Channel;
class EventLoop;

// 多路事件分发器
class Poller : noncopyable {
public:
  using ChannelList = std::vector<Channel*>;
  Poller(EventLoop *loop);
  virtual ~Poller() = default;
  // 向 poller 注册 Channel集合，给所有的 IO 复用保留统一的接口
  virtual Timestamp poll(int timeoutMs, ChannelList *channelList) = 0;
  virtual void updateChannel(Channel*) = 0;
  virtual void removeChannel(Channel*) = 0;
  // 判断参数 channel 是否在当前 Poller 中
  bool hasChannel(Channel* channel) const;
  // EventLoop通过这个接口获取一个具体的 Poller 对象
  static Poller* newDefaultPoller(EventLoop *loop);
protected:
  // map的 key 表示 socketfd
  using ChannelMap = std::unordered_map<int, Channel*>;
  ChannelMap m_channels; // 所有 Channel 集合
private:
  EventLoop* m_ownerEventLoop; // 定义 poller 所属的 EventLoop
};